#include <stdio.h>
#include <string.h>
#include <unistd.h>

void read1() {
    int fd[2];
    int i, myint;

    pipe(fd);

    dup2(fd[0], STDIN_FILENO);
    dup2(fd[1], STDOUT_FILENO);
    close(fd[0]);
    close(fd[1]);

    for (i = 0; i < 10; ++i) {
        printf("%d\n",i);
        fflush(stdout);         // fflush语句用来获得输出,否则由于printf设置了缓冲输出，程序会在scanf处挂起
        scanf("%d", &myint);
        fprintf(stderr, "%d\n", myint);
    }
}

void read2() {
    int fd[2];
    int i, myint;
    pid_t childpid;
    // 创建管道
    pipe(fd);
    dup2(fd[0], STDIN_FILENO);
    dup2(fd[1], STDOUT_FILENO);
    close(fd[0]);
    close(fd[1]);

    // 创建第二个管道，用于构成环形管道, 此时不进行错误判单
    pipe(fd);

    childpid = fork();
    if (childpid > 0) { // 父进程A执行
        // 将标准输出重定向到第二个管道的输入f[1]
        dup2(fd[1], STDOUT_FILENO);
    } else if (childpid == 0) { // 子进程B执行
        // 将标准输入重定向到第二个管道的输出f[0]
        dup2(fd[0], STDIN_FILENO);
    }

    // 从管道中读取内容，并输出
    for (i = 0; i < 10; i++) {
        write(STDOUT_FILENO, &i, sizeof(i));
        read(STDIN_FILENO, &myint, sizeof(myint));
        fprintf(stderr, "%d\n", myint);
    }
}

int main(void) {
    read2();

    return 0;
}